package fun.linze.wallpaperwebsite.util;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 一个用于处理 List&lt;String&gt; 集合操作的工具类。
 */
public final class ListSetUtils {

    /**
     * 私有构造函数，防止该工具类被实例化。
     */
    private ListSetUtils() {
    }

    /**
     * 计算两个列表的交集（即同时存在于两个列表中的元素）。
     *
     * @param list1 第一个列表
     * @param list2 第二个列表
     * @return 包含交集元素的新列表
     */
    public static List<String> getIntersection(List<String> list1, List<String> list2) {
        if (list1 == null || list2 == null) {
            return new ArrayList<>();
        }
        Set<String> set1 = new HashSet<>(list1);
        set1.retainAll(new HashSet<>(list2));
        return new ArrayList<>(set1);
    }

    /**
     * 计算两个列表的并集（即两个列表中的所有唯一元素）。
     *
     * @param list1 第一个列表
     * @param list2 第二个列表
     * @return 包含并集元素的新列表
     */
    public static List<String> getUnion(List<String> list1, List<String> list2) {
        if (list1 == null && list2 == null) {
            return new ArrayList<>();
        }
        Set<String> set = new HashSet<>();
        if (list1 != null) {
            set.addAll(list1);
        }
        if (list2 != null) {
            set.addAll(list2);
        }
        return new ArrayList<>(set);
    }

    /**
     * 计算两个列表的差集（即存在于 list1 但不存在于 list2 的元素）。
     *
     * @param list1 第一个列表
     * @param list2 第二个列表
     * @return 包含差集元素的新列表
     */
    public static List<String> getDifference(List<String> list1, List<String> list2) {
        if (list1 == null) {
            return new ArrayList<>();
        }
        if (list2 == null) {
            return new ArrayList<>(list1);
        }
        Set<String> set1 = new HashSet<>(list1);
        set1.removeAll(new HashSet<>(list2));
        return new ArrayList<>(set1);
    }

    /**
     * 计算两个列表的对称差集（即存在于任一列表但不是同时存在于两个列表中的元素）。
     *
     * @param list1 第一个列表
     * @param list2 第二个列表
     * @return 包含对称差集元素的新列表
     */
    public static List<String> getSymmetricDifference(List<String> list1, List<String> list2) {
        List<String> union = getUnion(list1, list2);
        List<String> intersection = getIntersection(list1, list2);
        return getDifference(union, intersection);
    }
}